/**
 * 数字转成汉字
 * @params num === 要转换的数字
 * @return 汉字
 * */
function toChinesNum(num) {
	let changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
	let unit = ['', '十', '百', '千', '万']
	num = parseInt(num)
	let getWan = (temp) => {
		let strArr = temp.toString().split('').reverse()
		let newNum = ''
		let newArr = []
		strArr.forEach((item, index) => {
			newArr.unshift(item === '0' ? changeNum[item] : changeNum[item] + unit[index])
		})
		let numArr = []
		newArr.forEach((m, n) => {
			if (m !== '零') numArr.push(n)
		})
		if (newArr.length > 1) {
			newArr.forEach((m, n) => {
				if (newArr[newArr.length - 1] === '零') {
					if (n <= numArr[numArr.length - 1]) {
						newNum += m
					}
				} else {
					newNum += m
				}
			})
		} else {
			newNum = newArr[0]
		}

		return newNum
	}
	let overWan = Math.floor(num / 10000)
	let noWan = num % 10000
	if (noWan.toString().length < 4) {
		noWan = '0' + noWan
	}
	return overWan ? getWan(overWan) + '万' + getWan(noWan) : getWan(num)
}
/*
 * 数字序号转字符串序号  0 => "A"
 */
function indexToString(index) {
	var charcode;
	return index.toString(26).split("").map(function(item, i) {
		charcode = item.charCodeAt(0);
		charcode += (charcode >= 97 ? 10 : 49);
		return String.fromCharCode(charcode)
	}).join("").toUpperCase();
}

/*
 * 字符串序号转数字序号  "A" => 0
 */
function stringToIndex(str) {
	var charcode;
	return parseInt(str.toLowerCase().split("").map(function(item, i) {
		charcode = item.charCodeAt(0);
		charcode -= (charcode < 107 ? 49 : 10);
		return String.fromCharCode(charcode)
	}).join(""), 26);
}
/*
 * 数字转中文 万亿以下
 */
function toChineseNumber(num) {
	const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean)
	const chars = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
	const units = ['', '十', '百', '千']
	const bigUnits = ['','万','亿']
	let result = ''
	function handleZero(str){
		return str.replace(/零{2,}/g, '零').replace(/零+$/g,'')
	}
	function _transform(n) {
		if(n==='0000'){
			return chars[0]
		}
		let result = ''
		for (let i = 0; i < n.length; i++) {
			const c = chars[+n[i]]
			let u = units[n.length - 1 - i]
			if(c===chars[0]){
				u = ''
			}
			result += c+u
			
		}
		result = handleZero(result)
		return result
	}
	for (var i = 0; i < numStr.length; i++) {
		const part = numStr[i]
		const c = _transform(part)
		const u = bigUnits[numStr.length - 1 - i]
		if(c===chars[0]){
			u=''
		}
		result = handleZero(result)
		result += c + u
		
	}
	return result
}
// 转大写中文
function toBigChineseNumber(num){
	const result = toChineseNumber(num)
	const map={
		零:'零',
		一:'壹',
		二:'贰',
		三:'叁',
		四:'肆',
		五:'伍',
		六:'陆',
		七:'柒',
		八:'捌',
		九:'玖',
		十:'拾',
		百:'佰',
		千:'仟',
		万:'萬',
		亿:'亿'
	}
	return result.split('').map(s=>map[s]).join('')
}

// 富文本解决图片宽度溢出
 function formatRichText(html) {
	let newContent = html.replace(/<img[^>]*>/gi, function(match, capture) {
		match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
		match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
		match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
		return match;
	});
	newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
		match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi,
			'max-width:100%;');
		return match;
	});
	newContent = newContent.replace(/<br[^>]*\/>/gi, '');
	newContent = newContent.replace(/\<img/gi,
		'<img mode="widthFix"  style="max-width:100%;height:auto;display:inline-block;margin:10rpx auto;"');
	return newContent;
}


/**
 * 时间格式化
 * 
 * @param String timestamp 时间戳
 * @param String fmt 返回的时间格式
 * yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
 */
 const timeFormat = (timestamp = null, fmt = 'yyyy-mm-dd') => {
	// 其他更多是格式化有如下:
	// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
	timestamp = parseInt(timestamp);
	// 如果为null,则格式化当前时间
	if (!timestamp) timestamp = Number(new Date());
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000;
	let date = new Date(timestamp);
	let ret;
	let opt = {
		"y+": date.getFullYear().toString(), // 年
		"m+": (date.getMonth() + 1).toString(), // 月
		"d+": date.getDate().toString(), // 日
		"h+": date.getHours().toString(), // 时
		"M+": date.getMinutes().toString(), // 分
		"s+": date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	};
	for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt);
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		};
	};
	return fmt;
}


/**
 * IM时间友好
 * 
 * @param String timestamp 时间戳
 * @param String | Boolean format 如果为时间格式字符串，超出一定时间范围，返回固定的时间格式；
 * 如果为布尔值false，无论什么时间，都返回多久以前的格式
 */
 const timeToChat = (timestamp = null) => {
	if (timestamp == null) timestamp = Number(new Date());
	timestamp = parseInt(timestamp);
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000;
	var timer = (new Date()).getTime() - timestamp;
	timer = parseInt(timer / 1000);
	// 如果小于5分钟,则返回"刚刚",其他以此类推
	let tips = '';
	switch (true) {
		case timer < 86400:
			tips = timeFormat(timestamp, 'hh:MM');
			break;
		case timer >= 86400 && timer < 86400 * 7:
			var now = new Date(timestamp);
			var week = ['日', '一', '二', '三', '四', '五', '六'];
			switch (new Date().getDate() - now.getDate()) {
				case 1:
					tips = timeFormat(timestamp, '昨天 hh:MM');
					break;
				case 2:
					tips = timeFormat(timestamp, '前天 hh:MM');
					break;
				default:
					tips = '星期' + week[now.getDay()] + timeFormat(timestamp, 'hh:MM');
			}
			break;
		case timer >= 86400 * 7:
			tips = timeFormat(timestamp, 'mm-dd hh:MM');
			break;
		default:
			tips = timeFormat(timestamp, 'yyyy-mm-dd hh:MM');
	}
	return tips;
}



export {
	toChinesNum,
	indexToString,
	stringToIndex,
	toChineseNumber,
	toBigChineseNumber,
	formatRichText,
	timeFormat,
	timeToChat
}